package bgai.gui;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

import bgai.gamelogic.Backgammon;
import bgai.gamelogic.CheckerColor;

/**
 * la barra in cui sono presenti i checker portati fuori
 */
public class BearOffBar extends JPanel{

	private static final long serialVersionUID = -2632567068618638044L;

	/**
	 * L'istanza BackgammonGUI in cui posizionare la barra 
	 */
	private BackgammonGUI bgGUI;
	
	/**
	 * Il pannello che contiene le pedine nere uscite
	 */
	private JPanel blackOff;
	
	/**
	 * Il pannello che contiene le pedine bianche uscite
	 */
	private JPanel whiteOff;
	
	
	/**
	 * Il numero di checkers portati fuori dai player
	 */
	
	private int numBlackOff,numWhiteOff;
	
	/**
	 * Il placeHolder temporaneo inserito. Puo' appartenere sia ai checker bianchi che a quelli neri
	 */
	private Checker placeholder;

	
	public BearOffBar(BackgammonGUI bgGUI){
		
		super();
		this.bgGUI=bgGUI;
		Color tableColor=new Color(139,69,19);
		this.setBackground(tableColor);
		float percWidth= ((float) 15/100) * bgGUI.getWidth();
		this.setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
		//this.setBorder(BorderFactory.createLineBorder(Color.blue));
    	this.setPreferredSize(new Dimension((int)percWidth, (int)(bgGUI.getHeight()/2)+20));
    	this.setMinimumSize(new Dimension((int)percWidth, (int)(bgGUI.getHeight()/2)+20));
    	//this.setBorder(BorderFactory.createEmptyBorder());
    	
    	
    	JPanel black=new JPanel();
    	black.setBackground(tableColor);
    	
    	Color bearOffColor=new Color(186,126,65);

		blackOff=new JPanel();
		blackOff.setLayout(new BoxLayout(blackOff, BoxLayout.PAGE_AXIS));
		blackOff.setBackground(bearOffColor);
		blackOff.setPreferredSize(new Dimension((int)percWidth/3, (int)bgGUI.getHeight()/2));
		blackOff.setSize(new Dimension((int)percWidth/3, (int)bgGUI.getHeight()/2));
		blackOff.setBorder(BorderFactory.createLineBorder(Color.black,2));

    	JPanel white=new JPanel();
    	white.setBackground(tableColor);

		whiteOff = new JPanel();
		whiteOff.setLayout(new BoxLayout(whiteOff, BoxLayout.PAGE_AXIS));
		whiteOff.setBackground(bearOffColor);
		whiteOff.setPreferredSize(new Dimension((int)percWidth/3, (int)bgGUI.getHeight()/2));
		whiteOff.setSize(new Dimension((int)percWidth/3, (int)bgGUI.getHeight()/2));
		whiteOff.setBorder(BorderFactory.createLineBorder(Color.white,2));

		black.add(blackOff);
		white.add(whiteOff);
		
		numBlackOff=0;
		
		numWhiteOff=0;
		
		this.add(black);
		this.add(white);
		
	}
	
	/**
	 * Aggiunge un checker che e' stato mangiato alla bar
	 * @param col il colore del checker da aggiungere
	 * @param placeHolder true se devo aggiungere un placeHolder, false altrimenti
	 */
	public void addChecker(CheckerColor col, boolean placeHolder){
		
		
		// creo il nuovo checker del colore passato
		Checker c= new Checker(col,Backgammon.OFF);
		c.setScaledImage((int)(-1),(int)(blackOff.getHeight()/15));
		
		if(placeHolder){ //devo aggiungere un placeHolder
				
			ImageIcon img = c.setPlaceholderImage((int)(-1),(int)(blackOff.getHeight()/15)); 
			Cursor handCurs = new Cursor(Cursor.HAND_CURSOR);
			c.setCursor(handCurs);
			c.addMouseListener(bgGUI);
			this.placeholder=c;			
		}
		
		if(col==CheckerColor.BLACK){
			
			blackOff.add(c);
			if(!placeHolder) numBlackOff++;
			/*if(placeHolder)
				blackOff.setBackground(Color.YELLOW);*/
			blackOff.revalidate();
			blackOff.repaint();
		}
		
		else{
			
			whiteOff.add(c);
			if(!placeHolder) numWhiteOff++;
			/*if(placeHolder)
				whiteOff.setBackground(Color.YELLOW);*/
			whiteOff.revalidate();
			whiteOff.repaint();
		}
		
		
	}
	
	
	/**
	 * Ottiene il numero di checkers portati fuori da un player
	 * @param col il colore del player al quale si sta facendo riferimento
	 * @return il numero dei checkers che il player 'col' ha portato fuori o -1 se c'e' stato un errore nel passaggio del colore
	 */
	public int getNumBarCheckers(CheckerColor col){
		
		if(col==CheckerColor.BLACK){
			
			return numBlackOff;
		}
		
		else if(col==CheckerColor.WHITE){
			
			return numWhiteOff;
		}
		
		
		else return -1;
		
		
	}
	
	/**
	 * Rimuove un placeholder dalla barra dei checker del player di colore col
	 * @param col il colore dell'insieme dei checker da cui rimuovere il placeHolder
	 */
	public void removePlaceHolder(CheckerColor col){
		
		if(placeholder==null) return; //non e' presente alcun placeholder
				
		if(col==CheckerColor.WHITE && placeholder.getColor()==CheckerColor.WHITE){ // rimuovere il placeHolder dal gruppo di chcker bianchi
			
			try{
				whiteOff.remove(placeholder);
			}
			catch(NullPointerException e){
				
				// niente, non c'era il segnaposto
			}
			placeholder=null;
			whiteOff.revalidate();
			whiteOff.repaint();
		
		}
		else if(col==CheckerColor.BLACK && placeholder.getColor()==CheckerColor.BLACK){ // rimuovere il placeholder dal gruppo di checker neri
			
			
			try{
				blackOff.remove(placeholder);
			}
			catch(NullPointerException e){
				
				// niente, non c'era il segnaposto
			}
			placeholder=null;
			blackOff.revalidate();
			blackOff.repaint();
			
		}
		
	}
	
	/**
	 * Retituisce true se e' mostrato un placeholder nella barra del bear off
	 * @return vedi descrizione metodo
	 */
	public boolean isPlaceholderShown(){
		
		return placeholder!=null;
		
	}
	
	
}
